import Vue from 'vue';

import { initApi } from './init/initApi';
import { initConfig } from './init/initConfig';
import { initEventEmitter } from './init/initEventEmitter';
import { initEvents } from './init/initEvents';
import { initImages } from './init/initImages';
import { initMap } from './init/initMap';
import { initSblxList } from './init/initSblxList';
import { initStyleList } from './init/initStyleList';
import { initTools } from './init/initTools';
import { initUtils } from './init/initUtils';

/**
 * 思极地图
 */
export default class SgMap {
  constructor(_) {
    // 参数
    this.options = _;
    // 地图
    this.map = null;
    // 事件驱动,基于Vue，太庞大
    this.eventBus = new Vue();
  }

  /**
   * 初始化地图
   * @param {Map} top 地图开放顶层
   * @ignore
   */
  async initMap(top) {
    this.map = await initMap(this.options);
    await top.start();
    this.eventBus.$emit('mapLoaded', this.map);
  }

  /**
   * 初始化参数配置
   * @param {Map} top 地图开放顶层
   * @param {Object} _default 参数配置
   * @ignore
   */
  initConfig(top, _default) {
    initConfig(top, _default);
  }

  /**
   * 初始化工具类
   * @param {Map} top 地图开放顶层
   * @ignore
   */
  initUtils(top) {
    initUtils(top, this);
  }

  /**
   * 初始化工具箱
   * @param {Map} top 地图开放顶层
   * @ignore
   */
  initTools(top) {
    initTools(top, this);
  }

  /**
   * 初始化服务接口
   * @param {Map} top 地图开放顶层
   * @param {*} request 请求方法
   * @ignore
   */
  initApi(top, request) {
    initApi(top, request);
  }

  /**
   * 初始化地图图标
   * @param {Map} top 地图开放顶层
   * @ignore
   */
  initImageList(top) {
    initImages(top, this);
  }

  /**
   * 初始化地图事件方法
   * @param {Map} top 地图开放顶层
   * @ignore
   */
  initEvents(top) {
    initEvents(top, this);
  }

  /**
   * 初始化地图驱动方法-不借助vue
   * @param {Map} top 地图开放顶层
   * @ignore
   */
  initEventEmitter(top) {
    initEventEmitter(top, this);
  }

  /**
   * 初始化电网式样
   * @param {Map} top 地图开放顶层
   * @ignore
   */
  initStyleList(top) {
    return initStyleList(top);
  }

  /**
   * 初始化设备类型
   * @param {Map} top 地图开放顶层
   * @ignore
   */
  initSblxList(top) {
    return initSblxList(top);
  }
}
